package br.com.bankai.koby.presentation.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.bankai.koby.presentation.util.SessionUtil;
import br.com.bankai.koby.repository.dom.DomPessoa;
import br.com.bankai.koby.repository.dom.DomPessoa.DomPapel;
import br.com.bankai.koby.repository.dom.DomPessoa.DomTipoContato;
import br.com.bankai.koby.repository.entity.Contato;
import br.com.bankai.koby.repository.entity.Usuario;
import br.com.bankai.koby.repository.entity.UsuarioSistema;
import br.com.bankai.koby.repository.entity.simple.UsuarioSimple;
import br.com.bankai.koby.repository.entity.simple.UsuarioSistemaSimple;
import br.com.bankai.koby.service.exception.AlreadyExistsException;
import br.com.bankai.koby.service.impl.PessoaFisicaService;
import br.com.bankai.koby.service.impl.UsuarioService;

/**
 * 
 * @author Jaison Pereira
 *
 */
@Controller
@Scope("view")
public class UsuarioController extends PessoaBaseController<Usuario, UsuarioSimple> implements InitializingBean {

	private static final long serialVersionUID = -4452406717245162707L;


	private static final String VIEW_USUARIO_SISTEMA = "cadastro/usuario";

	@Autowired
	private UsuarioService service;
	

	@Autowired
	protected PessoaFisicaService pessoaFisicaService;
	
	private Map<String, String> papeis = new HashMap<String, String>();

	
	
	
	
	
	
	
	
	
	
	

	@Override
	public void afterPropertiesSet() throws Exception {
		try {
			super.afterPropertiesSet();

			if (isView(VIEW_USUARIO_SISTEMA)) {
				setEntity(new UsuarioSistema());
				setFilterEntity(new UsuarioSistemaSimple());
			}
			
			
		} catch (Throwable t) {
			returnFatalMessage("Erro ao iniciar a tela, contate o administrador", null, t);
		}
	}
	
	
	@Override
	protected void beforeAdd() {
		if (isView(VIEW_USUARIO_SISTEMA)) {
			setEntity(new UsuarioSistema());
			setFilterEntity(new UsuarioSistemaSimple());
		} 
		if (SessionUtil.isPapel(DomPapel.ROOT)) {
			papeis.put(DomPessoa.domPapel.getDeValor(DomPapel.ADMINISTRADOR), DomPapel.ADMINISTRADOR);
			papeis.put(DomPessoa.domPapel.getDeValor(DomPapel.ROOT), DomPapel.ROOT);
		}

		
		
		//dando pau????
//		getEntity().getContatos().add(new Contato(DomTipoContato.EMAIL));
//		getEntity().setStatus(DomPessoa.DomStatusPessoaFisica.PENDENTE);
	}

	
	
	
	
	

	@Override
	protected boolean executeSave() {
		try {
			beforeSave(getEntity());

			service.save(getEntity());
			if (isEditing()) {
				returnInfoMessage("Usuário alterado com sucesso.", null);
			} else {
				returnInfoMessage("Usuário cadastrado com sucesso.", null);
			}
		} catch (AlreadyExistsException e) {
			returnWarnMessage("CPF já cadastrado.", null, e);
			return false;
		}
		

		return true;
	}


	@Override
	protected void executeEdit(UsuarioSimple entity) throws Exception {
		setEntity((Usuario) pessoaFisicaService.find(new Usuario(entity.getId(), null, entity.getTipo())));
	}

	@Override
	protected void executeSearch() {
		setEntities(service.search(getFilterEntity(), new ArrayList<String>(papeis.values())));
	}
	
	// Utilities
		public void resetPassword() {
			try {
				Usuario entity = (Usuario) getEntity();
				service.resetPassword(entity);
				returnInfoMessage("Nova senha gerada com sucesso e enviada para o e-mail " + entity.getEmail(), null);
			} catch (Throwable t) {
				returnFatalMessage("Erro ao gerar nova senha", null, t);
			}
		}
	
	

		// Getters e Setters
		public Map<String, String> getPapeis() {
			return papeis;
		}
	
	
}